package com.helloDemo.shiro;

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;

@Configuration
public class ShiroConfig {

	/**
	 * 创建ShiroFilterFactoryBean
	 */
	@Bean
	public ShiroFilterFactoryBean getShiroFilterFactoryBean(
			@Qualifier("securityManager") DefaultWebSecurityManager securityManager) {

		ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();

		shiroFilterFactoryBean.setSecurityManager(securityManager);

		// 添加shiro内置过滤器，实现权限相关的url拦截

		// 常见过滤器：
		// anon：无需认证（登录）可以访问
		// authc：必须认证才可以访问
		// user:如果使用Remember Me的功能，可以直接访问
		// perms:该资源必须得到资源权限才可以访问
		// role:该资源必须得到角色权限才可以访问

		Map<String, String> filterMap = new LinkedHashMap<String, String>();

//		filterMap.put("/add", "authc");
		// 跳转登陆页面
		shiroFilterFactoryBean.setLoginUrl("/login");

		shiroFilterFactoryBean.setUnauthorizedUrl("/demo/error");
		filterMap.put("/demo/error", "anon");
		filterMap.put("/add", "perms[user:add]");

		filterMap.put("/update", "perms[user:update]");

//		filterMap.put("/update", "authc");

//		filterMap.put("/index", "anon");

		filterMap.put("/toLogin", "anon");

		filterMap.put("/login", "anon");

		filterMap.put("/*", "authc");

		shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);

		return shiroFilterFactoryBean;

	}

	/**
	 * 创建DefaultWebSecurityManager
	 */
	@Bean(name = "securityManager")
	public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {

		DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
		// 关联 Realm
		securityManager.setRealm(userRealm);

		return securityManager;

	}

	/**
	 * 创建Realm
	 */
	@Bean(name = "userRealm")
	public UserRealm getRealm() {

		return new UserRealm();

	}

	/**
	 * 配置ShiroDialect,用于thymeleaf 和 shiro 标签 配合使用
	 */
	@Bean
	public ShiroDialect getShiroDialect() {

		return new ShiroDialect();

	}

}
